5.3 动态权限
需求: 不同的页面或者不同的场景 用户需要有不同的上下文-对应的就是不同的权限。
原理: 权限是根据授权主体查找的权限,如果授权主体是动态的就能实现动态权限,授权主体现在分为2部分
1. 静态授权主体 即根据组织机构树进行的权限分配。
2. 动态权限,用户可以在请求上带特殊的header指定当前请求属于哪些授权主体,动态权限的授权需要业务方主动调用授权api。授权api参考按组织授权页面。
后台根据静态和动态权限合并出当前的所有权限集合。
实现细节:
前端在page上扩展基础api
page.setRequestInfo(key,value) 设置当前页面请求附带的header信息
page.removeRequestInfo(key)
page.getRequestInfo(key)
以上三个api 是基础扩展api ,主要针对组件开发人员考虑使用 比如context组件已经使用。
以下api 针对组件和页面开发人员
page.request 签名对等 wx.request ,后续pcx,mobile发送网络请求不推荐 wx.request 统一为当前api ,当前api会自动带上当前页面相关的请求参数(参考上面api进行设置 )
context组件扩展api changeContext(contextKey="default",signature)
- contextKey: 默认为default 静态权限上下文 ,用户可以切换到动态上下文 key必须为授权主体code列表。逗号分隔
- signature: 切换上下文可以获得更大权限,所以切换的目标key需要校验安全性,签名规则为md5(contextKey + 秘钥) 签名合法才能够添加动态权限,签名校验是在后台api的权限判断中进行当前api(changeContext) 不进行校验,仅赋值。
- 秘钥 :默认为entry的appSecret 也可以自定义秘钥 通过配置entry环境变量 COMP_AUTHORIZE_SUBJECTINFO_KEY 即可
- 底层通过在请求中添加header X-Credential-Subject-Info 实现 结构{data:"",signature:""}
示例:
this.comp('wxContext0').changeContext("project001,project002","xxxx"); 切换动态权限后context上的所有相关权限会自动加载并计算。
总结:
- 页面扩展api this.request
- context组件扩展 changeContext
- 权限组件现支持自定义环境变量: a. COMP_AUTHORIZE_PERMISSION_LIMIT 最低权限要求 ,现在默认是authc 所以匿名用户访问没有授权的api就会403 b. COMP_AUTHORIZE_ANONYMOUS_CACHE_EXPIRE 匿名用户缓存自动更新时间 默认一分钟 单位毫秒 c. COMP_AUTHORIZE_SUBJECTINFO_KEY 动态权限自定义秘钥
- requestCacheWrapper 支持request 缓存实现。可以基于sessionStorage 和localstorage实现缓存,比如 菜单 权限 配置等需要多个地方获取,但是在一次登录周期内都不需要变动的场景。